package com.cn.common;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import utils.PageEntity;
import utils.PagingResult;

public interface IBaseDao<T,PK , Key, Val extends Serializable> {

	/**
	 * 新增实体
	 * @param T
	 * @return int
	 */
	abstract int insert(T entity);
	/**
	 * 根据主键查询实体
	 * @param T,PK
	 */
	abstract T select(PK primaryKey);
	/**
	 * 根据主键修改实体
	 * @param T,PK
	 */
	abstract int update(PK primaryKey);
	/**
	 * 根据主键删除实体
	 * @param PK
	 */
	abstract int delete(PK primaryKey);
	/**
	 * 批量插入
	 * @param List<T>
	 */
	abstract int insertList(final List<T> list);
	/**
	 * 批量修改
	 * @param List<T>
	 */
	abstract int updateList(final List<T> list);
	/**
	 * 批量删除
	 */
	abstract int deleteList(final List<PK> list);
	 /**  
     * 按条件查询记录  
     * @param param 查询条件参数，包括WHERE条件、分页条件、排序条件  
     * @return 符合条件记录的实体对象的List  
     */   
	abstract List<T> selectParam(Map<Key, Val> param);
	/**  
     * 按条件查询记录，并处理成分页结果  
     * @param param 查询条件参数，包括WHERE条件、分页条件、排序条件  
     * @return PaginationResult对象，包括（符合条件的）总记录数、页实体对象List等  
     */    
	abstract PagingResult<T> selectPagination(PageEntity param); 
    /**
     * 查询整表总记录数
     * @return
     */
	abstract int count();
    /**  
     * 查询符合条件的记录数  
     * @param param 查询条件参数，包括WHERE条件（其他参数内容不起作用）。此参数设置为null，则相当于count()  
     * @return  
     */    
	abstract int countParam(Object param);
    /**  
     * 清空表，比delete具有更高的效率，而且是从数据库中物理删除（delete是逻辑删除，被删除的记录依然占有空间）  
     * <p><strong>此方法一定要慎用！</strong></p>  
     * @return  
     */    
	abstract int truncate();
	/**
	 * 根据单一参数找到实体，类似用户名
	 * @param par
	 * @return T
	 */
	abstract T selectOne(Object param);
}
